!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||

 module vmix_const

!BOP
! !MODULE: vmix_const
!
! !DESCRIPTION:
!  This module initializes and computes vertical diffusivity and
!  viscosity for constant vertical mixing.
!
! !REVISION HISTORY:
!  SVN:$Id: vmix_const.F90 808 2006-04-28 17:06:38Z njn01 $

! !USES:

   use kinds_mod
   use blocks
   use distribution
   use grid
   use domain_size
   use domain
   use constants
   use broadcast
   use io
   use state_mod
   use exit_mod

   implicit none
   private
   save

! !PUBLIC MEMBER FUNCTIONS:

   public :: init_vmix_const,  &
             vmix_coeffs_const

!EOP
!BOC
!-----------------------------------------------------------------------
!
! module variables
!
!-----------------------------------------------------------------------

   real (r8) ::       &
      const_vvc,      &! constant value for viscosity
      const_vdc        ! constant value for diffusivity

!EOC
!***********************************************************************

 contains

!***********************************************************************
!BOP
! !IROUTINE: init_vmix_const
! !INTERFACE:

 subroutine init_vmix_const(VDC,VVC)

! !DESCRIPTION:
!  In this routine the diffusivity (VDC) and viscosity (VVC) are 
!  initialized to input values and remain constant throughout the
!  simulation.
!
! !REVISION HISTORY:
!  same as module

! !INPUT/OUTPUT PARAMETERS:

   real (r8), dimension(:,:,:,:,:), intent(inout) :: &
      VDC                 ! vertical tracer diffusivity

   real (r8), dimension(:,:,:,:), intent(inout) :: &
      VVC                 ! vertical viscosity for momentum

!EOP
!BOC
!-----------------------------------------------------------------------
!
!  local variables
!
!-----------------------------------------------------------------------

   integer (int_kind) :: nml_error

   namelist /vmix_const_nml/const_vvc, const_vdc

!-----------------------------------------------------------------------
!
!  set defaults for mixing coefficients, then read them from namelist
!
!-----------------------------------------------------------------------

   const_vvc = p25
   const_vdc = p25
      
   if (my_task == master_task) then
      open (nml_in, file=nml_filename, status='old',iostat=nml_error)
      if (nml_error /= 0) then
         nml_error = -1
      else
         nml_error =  1
      endif
      do while (nml_error > 0)
         read(nml_in, nml=vmix_const_nml,iostat=nml_error)
      end do
      if (nml_error == 0) close(nml_in)
   endif

   call broadcast_scalar(nml_error, master_task)
   if (nml_error /= 0) then
      call exit_POP(sigAbort,'ERROR reading vmix_const_nml')
   endif

   if (my_task == master_task) then
      write(stdout,'(a17,2x,1pe12.5)') '  const_vdc     =',const_vdc
      write(stdout,'(a17,2x,1pe12.5)') '  const_vvc     =',const_vvc
   endif

   call broadcast_scalar(const_vvc, master_task)
   call broadcast_scalar(const_vdc, master_task)

!-----------------------------------------------------------------------
!
!  set mixing coefficients for all time
!
!-----------------------------------------------------------------------

   VVC = const_vvc
   VDC = const_vdc

!-----------------------------------------------------------------------
!EOC

 end subroutine init_vmix_const

!***********************************************************************
!BOP
! !IROUTINE: vmix_coeffs_const
! !INTERFACE:

 subroutine vmix_coeffs_const(k,VDC,VVC,TMIX,                &
                                this_block, convect_diff, convect_visc)

! !DESCRIPTION:
!  Computes vertical diffusion coefficients. Because these are
!  independent of time, no calculation are done here unless a
!  diffusive form of convection is chosen.  In such a case,
!  the routine checks for stability and enhances the diffusion
!  coefficients with the convective diffusion coefficient.
!
! !REVISION HISTORY:
!  same as module

! !INPUT PARAMETERS:

   integer (int_kind), intent(in) :: k  ! vertical level index

   real (r8), dimension(nx_block,ny_block,km,nt), intent(in) :: &
      TMIX                ! tracers at mix time level

   real (r8), intent(in), optional :: &
      convect_diff,      &! diffusivity to mimic convection
      convect_visc        ! viscosity   to mimic convection

   type (block) :: &
      this_block          ! block information for current block

! !INPUT/OUTPUT PARAMETERS:

   real (r8), dimension(:,:,:,:), intent(inout) :: &
      VDC                 ! vertical tracer diffusivity

   real (r8), dimension(:,:,:), intent(inout) :: &
      VVC                 ! vertical viscosity for momentum

!EOP
!BOC
!-----------------------------------------------------------------------
!
!  local variables
!
!-----------------------------------------------------------------------

   integer (int_kind) :: & 
      kp1,               &! vertical level index
      bid                 ! local block address

   real (r8), dimension(nx_block,ny_block) :: &
      RHOK, RHOKP

   real (r8) :: &
      vvconv             ! viscosity due to convection

!-----------------------------------------------------------------------
!
!  if using diffusion to simulate convection, enhance the vertical 
!  mixing coefficients if gravitationally unstable
!
!-----------------------------------------------------------------------

   if (present(convect_diff)) then

      bid = this_block%local_id

      VVC(:,:,k  ) = const_vvc
      VDC(:,:,k,1) = const_vdc

      kp1 = min(k+1,km)

      call state(k  ,kp1,TMIX(:,:,k  ,1), TMIX(:,:,k  ,2), &
                         this_block, RHOOUT=RHOK )
      call state(kp1,kp1,TMIX(:,:,kp1,1), TMIX(:,:,kp1,2), &
                         this_block, RHOOUT=RHOKP)

      if (convect_visc /= c0) then
         vvconv = convect_visc
      else
         vvconv = const_vvc  ! convection only affects tracers
      endif

      where ((RHOK > RHOKP) .and. (k < KMT(:,:,bid)))
         VDC(:,:,k,1) = convect_diff
         VVC(:,:,k)   = vvconv
      endwhere
   endif

!-----------------------------------------------------------------------
!EOC

 end subroutine vmix_coeffs_const

!***********************************************************************

 end module vmix_const

!|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
